package com.qq.vip.mikuPy2001.bukkit.gui.util;

import com.google.common.base.Strings;
import java.io.PrintWriter;
import java.io.StringWriter;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin;

/**
 * 插件消息输出工具
 */
public enum Message {
    nothing, error, warn, info, debug;
    private static String pix;
    private static Message log = warn;

    /**
     * 设置像后台输出的级别.
     *
     * @param logint 允许的变量为 0 nothing, error, warn, info, debug 4 不正确则不改变
     */
    public static void setLog(int logint) {
        try {
            log = values()[logint];
        } catch (Exception e) {
        }
    }

    /**
     * 设置像后台输出的级别.
     *
     * @param logstr 允许的变量为 nothing, error, warn, info, debug 不正确则不改变
     */
    public static void setLog(String logstr) {
        try {
            log = valueOf(logstr.toLowerCase());
        } catch (Exception e) {
        }
    }

    /**
     * 设置像后台输出的级别.
     *
     * @param log
     */
    public static void setLog(Message log) {
        if (log == null)
            Message.log = warn;
        else
            Message.log = log;
        debug("插件启动debug状态. 请注意.");
    }

    /**
     * 向后台发送严重错误信息.
     * <p>
     * 信息结构："[严重错误]" + msg
     *
     * @param msg 要发送的信息
     */
    public static void error(String msg) {
        if (is(error))
            send(ChatColor.GOLD + "[" + ChatColor.RED + "error" + ChatColor.GOLD + "] " + ChatColor.RED + msg);
    }

    /**
     * 向后台发送严重错误信息.
     * <p>
     * 信息结构："[严重错误]" + msg
     *
     * @param msg 要发送的信息
     * @param e
     */
    public static void error(String msg, Throwable e) {
        error(add(msg, e));
    }

    /**
     * 向后台发送警告信息.
     * <p>
     * 信息结构："[警告]" + msg
     *
     * @param msg 要发送的信息
     */
    public static void warn(String msg) {
        if (is(warn))
            send(ChatColor.GOLD + "[" + ChatColor.YELLOW + "warn" + ChatColor.GOLD + "] " + ChatColor.YELLOW + msg);
    }

    /**
     * 向后台发送警告信息.
     * <p>
     * 信息结构："[警告]" + msg
     *
     * @param msg 要发送的信息
     * @param e
     */
    public static void warn(String msg, Throwable e) {
        warn(add(msg, e));
    }

    /**
     * 向后台发送info信息.
     *
     * @param msg 要发送的信息
     */
    public static void info(String msg) {
        if (is(info))
            send(ChatColor.GOLD + "[" + ChatColor.RESET + "info" + ChatColor.GOLD + "] " + ChatColor.RESET + msg);
    }

    /**
     * 向后台发送info信息.
     *
     * @param msg 要发送的信息
     * @param e
     */
    public static void info(String msg, Throwable e) {
        info(add(msg, e));
    }

    /**
     * 向后台发送DEBUG信息.
     * <p>
     * 信息结构："[DEBUG]" + msg
     *
     * @param msg 要发送的信息
     */
    public static void debug(String msg) {
        if (is(debug))
            send(ChatColor.GOLD + "[" + ChatColor.RED + "DEBUG" + ChatColor.GOLD + "] " + ChatColor.RESET + msg);
    }

    /**
     * 向后台发送DEBUG信息.
     * <p>
     * 信息结构："[DEBUG]" + msg
     *
     * @param msg 要发送的信息
     * @param e
     */
    public static void debug(String msg, Throwable e) {
        debug(add(msg, e));
    }

    /**
     * 向玩家发送消息. 发送前先替换所有变量. 自动加上前缀.
     *
     * @param player
     * @param msg
     * @param args
     */
    public static void sendMessage(CommandSender player, String msg, String... args) {
        send(player, replaceValue(msg, args));
    }

    /**
     * 向后台发送消息. 发送前先替换所有变量. 自动加上前缀.
     *
     * @param msg
     * @param args
     */
    public static void sendMessage(String msg, String... args) {
        send(replaceValue(msg, args));
    }

    /**
     * 广播消息. 发送前先替换所有变量. 自动加上前缀.
     *
     * @param msg
     * @param args
     */
    public static void broadcastMessage(String msg, String... args) {
        Bukkit.broadcastMessage(ChatColor.translateAlternateColorCodes('&', pix + replaceValue(msg, args)));
    }

    /**
     * 将文本中的变量依次替换. 变量格式为{0}{1}...
     *
     * @param msg
     * @param args
     * @return
     */
    public static String replaceValue(String msg, String... args) {
        for (int i = 0; i < args.length; i++)
            msg = msg.replace("{" + i + "}", args[i].trim());

        return msg;
    }

    /**
     * 获取前缀
     *
     * @return
     */
    public static String getPix() {
        return pix;
    }

    /**
     * 设置前缀.
     *
     * @param pix
     */
    public static void setPix(String pix) {
        Message.pix = ChatColor.GOLD + "[" + ChatColor.GREEN + pix + ChatColor.GOLD + "] " + ChatColor.RESET;
    }

    /**
     * 设置前缀.
     *
     * @param plugin
     */
    public static void setPix(JavaPlugin plugin) {
        String prefix = plugin.getDescription().getPrefix();
        if (Strings.isNullOrEmpty(prefix))
            setPix(plugin.getName());
        else
            setPix(prefix);
    }

    private static void send(String msg) {
        send(Bukkit.getConsoleSender(), msg);
    }

    private static void send(CommandSender sender, String msg) {
        sender.sendMessage(ChatColor.translateAlternateColorCodes('&', pix + msg));
    }

    public static boolean is(Message logs) {
        return logs.ordinal() <= log.ordinal();
    }

    private static String add(String msg, Throwable e) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw, true);
        e.printStackTrace(pw);
        return msg + System.getProperty("line.separator") + ChatColor.RESET + sw.toString();
    }
}
